# 控制流关键字（需要排除的）
control_keywords = [
    'if', 'then', 'else', 'elseif', 'endif', 
    'do', 'enddo', 'while', 'case', 
    'select', 'endselect', 'where', 'elsewhere',
    'forall', 'exit', 'cycle', 'continue',
    'goto', 'return'
]

# 过滤掉一些高频调用的函数（通过统计得到）来简化函数关系图谱
func_names = [
                # 时间/驱动相关函数
                't_startf', 't_drvstartf', 't_stopf', 't_drvstopf', 'dtime_setup', 'dtime_show', 'dtime_check', 'dtast',
                # MPI 通信相关
                'mpi_reduce', 'mpi_finalize', 'mpi_allreduce', 'mpi_allgather', 'mpi_gatherv', 'mpi_alltoallv',
                'mpi_type_contiguous', 'mpi_type_commit', 'mpi_type_free',
                # GSI 数据操作
                'gsi_bundlegetpointer', 'gsi_bundleputvar', 'gsi_bundlegetvar', 'gsi_bundledestroy', 'gsi_bundlecreate',
                'gsi_metguess_get', 'gsi_chemguess_get', 
                # # 网格变换相关
                # 'init_general_transform', 'general_sub2grid_create_info', 'general_sub2grid', 'general_grid2sub',
                # 'nmmb_h_to_a8', 'zrnmi_x_strans', 'zrnmi_y_strans', 'tintrp2a1', 'grdcrd1', 'tintrp2a11', 'tintrp31',
                # # 内存管理
                # 'allocate_state', 'deallocate_state', 'allocate_cv', 'deallocate_cv',
                # # 错误处理/验证
                'perr', 'error_msg', 'check', 'nc_check', 'check_vars_', 'log_error', 'handle_error','log_notice', 'log_warning',
                'grapes_error_fatal',
                # # 观测/诊断数据
                # 'obsllist_appendnode', 'nc_diag_read_get_var',
                # # 系统级操作
                'stop2', 'die', 'ufbint', 'tell', 'strip',
                # # 初始化/清理
                # 'init_vars_', 'final_vars_',
                # # 工具函数
                # 'get_ij', 'self_add'
            ]

from typing import List
import re

def _match_pattern(name: str, pattern: str, case_sensitive: bool = False) -> bool:
    """
    检查名称是否匹配模式
    
    参数:
        name: 要检查的名称
        pattern: 匹配模式（支持*通配符）
        case_sensitive: 是否区分大小写
        
    返回:
        如果名称匹配模式，则为True
    """
    # 如果不区分大小写，则将名称和模式转换为小写
    if not case_sensitive:
        name = name.lower()
        pattern = pattern.lower()
    
    # 将glob样式的模式转换为正则表达式
    regex_pattern = pattern.replace('.', '\\.')  # 转义点
    regex_pattern = regex_pattern.replace('*', '.*')  # *转换为.*
    regex_pattern = '^' + regex_pattern + '$'  # 添加开始和结束锚点
    
    return bool(re.match(regex_pattern, name))


def filter_func_names(func_names: List[str], 
                     include_patterns: List[str] = None, 
                     exclude_patterns: List[str] = None,
                     case_sensitive: bool = False) -> List[str]:
    """
    根据模式列表筛选函数名称
    
    参数:
        func_names: 要筛选的函数名称列表
        include_patterns: 包含模式列表（如果为None，则包含所有）
        exclude_patterns: 排除模式列表（如果为None，则不排除任何函数）
        case_sensitive: 是否区分大小写（默认为False）
        
    返回:
        筛选后的函数名称列表
    """
    if not func_names:
        return []
        
    # 如果没有包含模式，则默认包含所有函数
    if include_patterns is None:
        filtered_names = func_names.copy()
    else:
        filtered_names = []
        for name in func_names:
            for pattern in include_patterns:
                if _match_pattern(name, pattern, case_sensitive):
                    filtered_names.append(name)
                    break
    
    # 如果有排除模式，则进一步筛选
    if exclude_patterns:
        result = []
        for name in filtered_names:
            exclude = False
            for pattern in exclude_patterns:
                if _match_pattern(name, pattern, case_sensitive):
                    exclude = True
                    break
            if not exclude:
                result.append(name)
        return result
    
    return filtered_names